Import("env")

wrapped_fn_list = [
    #
    # used by our firmware, so we provide their realizations
    #
    "fflush",
    "printf",
    "putc",  # fallback from printf, thanks gcc
    "putchar",  # storage cli
    "puts",  # fallback from printf, thanks gcc
    "snprintf",
    "vsnprintf",  # m-string
    "__assert",  # ???
    "__assert_func",  # ???
    #
    # wrap other functions to make sure they are not called
    # realization is not provided
    #
    "setbuf",
    "setvbuf",
    "fprintf",
    "vfprintf",
    "vprintf",
    "fputc",
    "fputs",
    "sprintf",  # specially, because this function is dangerous
    "asprintf",
    "vasprintf",
    "asiprintf",
    "asniprintf",
    "asnprintf",
    "diprintf",
    "fiprintf",
    "iprintf",
    "siprintf",
    "sniprintf",
    "vasiprintf",
    "vasniprintf",
    "vasnprintf",
    "vdiprintf",
    "vfiprintf",
    "viprintf",
    "vsiprintf",
    "vsniprintf",
    #
    # standard input
    #
    "fgetc",
    "getc",
    "getchar",
    "fgets",
    "ungetc",
    #
    # standard input, but unimplemented
    #
    "gets",
    #
    # scanf, not implemented for now
    #
    # "fscanf",
    # "scanf",
    # "sscanf",
    # "vsprintf",
    # "vfscanf",
    # "vscanf",
    # "vsscanf",
    # "fiscanf",
    # "iscanf",
    # "siscanf",
    # "vfiscanf",
    # "viscanf",
    # "vsiscanf",
    #
    # File management
    #
    # "fclose",
    # "freopen",
    # "fread",
    # "fwrite",
    # "fgetpos",
    # "fseek",
    # "fsetpos",
    # "ftell",
    # "rewind",
    # "feof",
    # "ferror",
    # "fopen",
    # "remove",
    # "rename",
    # "fseeko",
    # "ftello",
]

for wrapped_fn in wrapped_fn_list:
    env.Append(
        LINKFLAGS=[
            "-Wl,--wrap," + wrapped_fn,
            "-Wl,--wrap," + wrapped_fn + "_unlocked",
            "-Wl,--wrap,_" + wrapped_fn + "_r",
            "-Wl,--wrap,_" + wrapped_fn + "_unlocked_r",
        ]
    )

env.Append(
    SDK_HEADERS=[
        File("wrappers.h"),
    ],
    LINT_SOURCES=[
        Dir("."),
    ],
)

libenv = env.Clone(FW_LIB_NAME="print")
libenv.ApplyLibFlags()
if env["RAM_EXEC"]:
    libenv.AppendUnique(CPPDEFINES=["PRINTF_DISABLE_SUPPORT_FLOAT"])

libenv.Append(CCFLAGS=["-Wno-double-promotion"])

sources = libenv.GlobRecursive("*.c*", ".")

lib = libenv.StaticLibrary("${FW_LIB_NAME}", sources)
libenv.Install("${LIB_DIST_DIR}", lib)
Return("lib")
